package org.example.Proxy;


import io.netty.bootstrap.ServerBootstrap;

import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.*;


// 定义一个HTTP代理服务器类
public class HttpProxyServer {

    // 代理服务器监听的端口
    private final int port;

    // 构造函数，初始化代理服务器的端口
    public HttpProxyServer(int port) {
        this.port = port;
    }

    // 启动代理服务器的方法
    public void start() throws Exception {
        // 创建一个boss线程组，用于接收客户端的连接请求
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        // 创建一个worker线程组，用于处理客户端的数据读写请求
        EventLoopGroup workerGroup = new NioEventLoopGroup();

        try {
            // 创建一个服务器引导程序
            ServerBootstrap bootstrap = new ServerBootstrap();
            // 设置boss线程组和worker线程组，以及使用NIO作为传输类型
            bootstrap.group(bossGroup, workerGroup)
                    // 设置使用NIO的ServerSocketChannel作为服务器的通道实现
                    .channel(NioServerSocketChannel.class)
                    // 设置子通道的处理器
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        // 初始化子通道的方法
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            // 添加HTTP编解码器，用于处理HTTP消息的编码和解码
                            ch.pipeline().addLast(new HttpServerCodec());
                            // 添加一个HTTP消息聚合器，用于将多个HTTP消息聚合成一个FullHttpRequest或FullHttpResponse
                            // 这里的65536是聚合的字节大小限制
                            ch.pipeline().addLast(new HttpObjectAggregator(65536));
                            // 添加自定义的HTTP代理服务器处理器
                            ch.pipeline().addLast(new HttpProxyServerHandler(workerGroup));
                        }
                    });

            // 绑定端口并启动服务器，然后等待服务器套接字关闭
            ChannelFuture future = bootstrap.bind(port).sync();
            future.channel().closeFuture().sync();
        } finally {
            // 优雅地关闭worker线程组
            workerGroup.shutdownGracefully();
            // 优雅地关闭boss线程组
            bossGroup.shutdownGracefully();
        }
    }

    // 主方法，用于启动HTTP代理服务器
    public static void main(String[] args) throws Exception {
        new HttpProxyServer(8000).start(); // 在8080端口上启动HTTP代理服务器
    }
}



